package com.hs.jwt;

import cn.hutool.jwt.JWT;
import cn.hutool.jwt.JWTUtil;
import cn.hutool.jwt.signers.JWTSigner;
import cn.hutool.jwt.signers.JWTSignerUtil;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.core.io.ClassPathResource;
import org.springframework.security.rsa.crypto.KeyStoreKeyFactory;

import java.security.KeyPair;
import java.util.HashMap;
import java.util.Map;

/**
 * @author Bai Dingkun
 * @date 2022-07-13
 * @desc
 */

@Data
@AllArgsConstructor
@NoArgsConstructor
public class JwtTemplate {

    // 证书文件
    private String path = "jwt.jks";
    // 密钥库文件的密码
    private String keyStoreSecurity = "123456";
    // 密钥库的别名
    private String alias = "jwt";

    /**
     * 创建密钥对对象
     */
    private KeyPair keyPair(){
        // 创建密钥对对象
        KeyStoreKeyFactory factory = new KeyStoreKeyFactory(
                new ClassPathResource(path),keyStoreSecurity.toCharArray()
        );
        KeyPair keyPair = factory.getKeyPair(alias);
        return keyPair;
    }

    /**
     * 创建签名器
     */
    private JWTSigner jwtSigner(){
        return JWTSignerUtil.createSigner("RSA",keyPair());
    }

    /**
     * 【生成token】
     */
    public String createToken(Map<String,Object> playload) {
        return JWTUtil.createToken(playload,jwtSigner());
    }

    /**
     * 【校验token】
     */
    public boolean verify(String token) {
        return JWTUtil.verify(token, jwtSigner());
    }

    /**
     * 【解析token】
     */
    public Object parseToken(String token,String key) {
        JWT jwt = JWTUtil.parseToken(token);
        return jwt.getPayload(key);
    }

//    public static void main(String[] args) {
//        JwtTemplate jwtTemplate = new JwtTemplate();
//
//        // 构建token中存储的数据，用map存储
//        Map<String,Object> playload = new HashMap<>();
//        playload.put("userId",100);
//
//        //【生成token】
//        String token = jwtTemplate.createToken(playload);
//        System.out.println("token = " + token);
//
//        //【验证token】
//        boolean verify = jwtTemplate.verify(token);
//
//        //【解析token】
//        if (verify) {
//            Object userId = jwtTemplate.parseToken(token,"userId");
//            System.out.println("userId = " + userId);
//        }
//    }
}
